Firestore のセキュリティルールの書き方チートシート

便利関数たち

エイリアス的な者たちを最初に書いておく。これ以降のものはここに書いたものを使っていることがある。

// Auth でログイン済みかどうか
function isSignedIn() {
  return request.auth.uid != null;
}

// Auth の user ID と一致するか
function isSameUser(userId) {
  return isSignedIn() ? (request.auth.uid == userId) : false;
}

// リクエストのデータのエイリアス
function incomingData() {
  return request.resource.data;
}

// リクエストに成功した後の状態の特定の path のデータを取得する
function getAfterData(path) {
  return getAfter(path).data;
}

// 配列からドキュメントの path を作成する
function documentPath(paths) {
  return path([
    ['databases', database, 'documents'].join('/'),
    paths.join('/')
  ].join('/'));
}
// 使い方
documentPath(["users", likedUserID, "likedReviews", reviewID]);
// -> "database/{database}/documents/users/{likedUserID}/likedReviews/{reviewID}"

フィールドが存在することを確認する

"fieldName" in incomingData();

フィールドの型を検証する

incomingData().fieldName is string; // number なり timestamp なり

// よく存在確認と組み合わせて、こんな関数を作っている
function validate(data) {
  return "fieldName" in data && data.fieldName is string
  && "another" in data && data.another is number;
}

サーバー時間と一致することを検証する

function isRequestedTime(time) {
  return time == request.time;
}

参考

Firestore セキュリティルール